#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>

int main(int argc, char* argv[])
{
    if(argc != 2)
      return 1;
    int fd = open(argv[1], O_RDONLY);
    if(fd < 0)
    {
        perror("open failed!\n");
        return 1;
    }
    dup2(fd, 0);
    close(fd);
    while(1)
    {
        char buffer[64];
        if(!fgets(buffer,sizeof(buffer), stdin)) break;
        printf("%s",buffer);
    }

    return 0;
}
//int main()
//{ 
//    umask(0);
//    int fd = open("log.txt", O_RDONLY);
//    if(fd < 0)
//    {
//        perror("open failed!\n");
//        return 1;
//    }
//    dup2(fd, 0);
//    close(fd);
//    while(1)
//    {
//        char buffer[64];
//        if(!fgets(buffer, sizeof(buffer), stdin)) break;
//        printf("%s", buffer);
//    }
//
//    //umask(1);
//    //int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
//    //if(fd < 0)
//    //{
//    //    perror("open file\n");
//    //    return 1;
//    //}
//    //dup2(fd, 1);
//    //printf("fd: %d\n", fd);
//    //const char* msg = "do me a favour\n";
//    //write(fd, msg, strlen(msg));
//    //printf("hello world\n");
//    //fprintf(stdout, "hello world\n");
//    //umask(1);
//    //close(0);
//    //int fd1 = open("log1.txt", O_CREAT | O_WRONLY, 0666);
//    //printf("fd1: %d\n", fd1);
//
//
//    //close(2);
//    //int fd2 = open("log1.txt", O_CREAT | O_WRONLY, 0666);
//    //printf("fd2: %d\n", fd2);
//    //umask(0);
//    //printf("stdin: %d\n", stdin->_fileno);
//    //printf("stdout: %d\n", stdout->_fileno);
//    //printf("stderr: %d\n", stderr->_fileno);
//    //int fd1 = open("log1.txt", O_CREAT | O_WRONLY, 0666);
//    //int fd2 = open("log2.txt", O_CREAT | O_WRONLY, 0666);
//    //int fd3 = open("log3.txt", O_CREAT | O_WRONLY, 0666);
//    //int fd4 = open("log4.txt", O_CREAT | O_WRONLY, 0666);
//    //printf("fd1: %d\n", fd1);
//    //printf("fd2: %d\n", fd2);
//    //printf("fd3: %d\n", fd3);
//    //printf("fd4: %d\n", fd4);
//    return 0;
//}

//int main()
//{
//    int fd  = open("log.txt", O_RDONLY);
//    if(fd < 0)
//    {
//        perror("open failed!\n");
//        return 1;
//    }
//    char buffer[128];
//    read(fd, buffer, sizeof(buffer));
//    printf("%s\n", buffer);
//    return 0;
//}
//int main()
//{
//    umask(0);
//    //int fd = open("log.txt", O_CREAT | O_WRONLY | O_APPEND, 0666);
//    int fd = open("log.txt", O_CREAT | O_WRONLY | O_TRUNC, 0666);
//    if(fd < 0)
//    {
//        perror("open failed!\n");
//        return 1;
//    }
//   // int i = 12345;
//   // write(fd, &i ,sizeof(i));
//  const char* msg1 = "abcd\n";
//  write(fd, msg1, strlen(msg1));
//  const char* msg = "open a file\n";
//  int cnt = 5;
//  while(cnt)
//  {
//      write(fd, msg, strlen(msg));
//      cnt--;
//  }
//    close(fd);
//    return 0;
//}
//#define ONE_FLAG (1<<0)
//#define TWO_FLAG (1<<1)
//#define THREE_FLAG (1<<2)
//#define FOUR_FLAG (1<<3)
//
//void Func(int flag)
//{
//    if(flag & ONE_FLAG)
//    {
//        printf("flag one\n");
//    }
//    else if(flag & TWO_FLAG)
//    {
//        printf("flag two\n");
//    }
//    else if(flag & THREE_FLAG)
//    {
//        printf("flag three\n");
//    }
//    else 
//    {
//        printf("flag four\n");
//    }
//}
//int main()
//{
//    Func(ONE_FLAG);
//    Func(TWO_FLAG);
//    Func(THREE_FLAG);
//    Func(FOUR_FLAG);
//    return 0;
//}
